package com.hunliji.monitor.share.utils;


import com.hunliji.common.exception.WarnException;
import com.hunliji.monitor.share.component.redis.enums.RedisKeyEnum;
import com.hunliji.monitor.share.component.redis.enums.RedisPackageSceneEnum;
import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * redis key 生成器
 * @author wuchen
 */
public class RedisKeyUtil {
    /**
     * 生成redis的key，如果需要使用redis必须使用当前方法生成相关的key，
     * 否则操作redis会被拦截
     * @param redisKeyEnum
     * @param params
     * @return
     */
    public static String getKey(RedisKeyEnum redisKeyEnum, String... params){
        StringBuilder sb = new StringBuilder("");
        sb.append(redisKeyEnum.getScene().name());
        sb.append(":");
        sb.append(redisKeyEnum.name());
        if(params.length>0){
            for(String param:params){
                sb.append(":");
                sb.append(param);
            }
        }
        return sb.toString();
    }

    /**
     * redis key 的最低组成部分
     */
    private static final Integer MIN_KEY_PART = 2;

    /**
     * 做key 的基础校验
     * @param key
     */
    public static void checkKey(String key){
        if(StringUtils.isBlank(key)){
            throw new WarnException("key不能为空");
        }
        //todo 校验长度，过长的redis key不可使用
        String[] keys = key.split(":");
        if(keys.length<MIN_KEY_PART){
            throw new WarnException("redis key格式异常");
        }
        String sceneName = keys[0];
        if(Objects.isNull(RedisPackageSceneEnum.getByName(sceneName))){
            throw new WarnException("redis key格式异常-未包含场景字段");
        }
        String name = keys[1];
        if(Objects.isNull(RedisKeyEnum.getByName(name))){
            throw new WarnException("redis key格式异常-具体缓存key");
        }
    }


}
